#include <iostream>
using namespace std;

class A{
public:
    A() = default;
    A(const A& a){
        cout << __PRETTY_FUNCTION__ << endl;
    }
};

void foo(A){

}

A bar(){
    A a;
    return a;
}

int main(){
    A a1;
    // 什么时候会调用拷贝构造函数;
    cout << "显式调用拷贝构造函数" << endl; 
    A a2(a1); cout << endl;

    cout << "作为形式参数传递1" << endl; 
    foo(a1); cout << endl;

    // 如果没有加上 -fno-elide-constructors，编译器会自动优化下面的代码
    cout << "作为返回值" << endl;
    A a3 = bar(); cout << endl;

    return 0;
}
